/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejercicio.practica1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import static java.lang.Math.cos;
import static java.lang.Math.pow;
import static java.lang.Math.sin;
import java.util.Scanner;

/**
 *
 * @author manolo
 */
public class NewtonRaphson {

    /**
     * @param args the command line arguments
     * @throws java.io.IOException
     */
    public static void main(String[] args) throws IOException {
        int opcion;
        Scanner dato = new Scanner(System.in);

        do {
            System.out.println("");
            System.out.println("**********************************");
            System.out.println("Elija la función que desea evaluar");
            System.out.println("**********************************");
            System.out.println("");
            System.out.println("1.- Función f(x)= cos(x)-x³");
            System.out.println("2.- Función f(x)= x²-5");
            System.out.println("0.- Salir");
            opcion = dato.nextInt();
            switch (opcion) {
                case 1:
                    funcionUno();
                    break;
                case 2:
                    funcionDos();
                    break;
                case 0:
                    System.exit(0);
                default:
                    System.out.println("La opción elegida no es válida");                    
            }

        } while (opcion != 0);


    }

    private static void funcionUno() throws IOException {
        int iteraciones;
        float valorInicial;
        float valor = 0;
        BufferedReader dato = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("Introduzca el valor inicial en el intervalo [0,1]: ");
        valorInicial = Float.parseFloat(dato.readLine());
        System.out.println("Introduzca el número de iteraciones: ");
        iteraciones = Integer.parseInt(dato.readLine());

        for (int i = 0; i < iteraciones; i++) {
            valor = (float) (valorInicial - ((cos(valorInicial) - pow(valorInicial, 3)) / (sin(valorInicial) - (3 * pow(valorInicial, 2)))));
            if (i < iteraciones) {
                valorInicial = valor;
            }
        }

        System.out.println("El valor aproximado entre [0,1] de la función f(x)= cos(x)-x³ es: " + valor);

    }

    private static void funcionDos() throws IOException {
        
        int iteraciones;
        float valorInicial;
        float valor = 0;
        BufferedReader dato = new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("Introduzca el valor inicial en el intervalo [2,3]: ");
        valorInicial = Float.parseFloat(dato.readLine());
        System.out.println("Introduzca el número de iteraciones: ");
        iteraciones = Integer.parseInt(dato.readLine());

        for (int i = 0; i < iteraciones; i++) {
            valor = (float) (valorInicial - ((pow(valorInicial, 2) - 5) / (2 * valorInicial)));
            if (i < iteraciones) {
                valorInicial = valor;
            }
        }

        System.out.println("El valor aproximado entre [2,3] de la función f(x)= x²-5 es: " + valor);

    }
}
